<?php
// 应用公共文件

use app\common\lib\FileWrapper;
use think\response\Json;

error_reporting(E_ERROR | E_PARSE);

if (!function_exists('success')) {
    /**
     * 成功返回函数
     * @param mixed $result
     * @param mixed $msg
     * @param string $redirectUrl
     * @return Json
     */
    function success($msg = 'ok', $result = [], string $redirectUrl = ''): Json
    {
        $data = [
            'code' => 1,
            'msg' => $msg,
            'result' => $result,
            'url' => $redirectUrl,
        ];
        return json($data,200, ['Access-Control-Expose-Headers'=>'Authorization']);
    }
}


if (!function_exists('error')) {
    /**
     * 失败返回函数
     * @param string $msg
     * @param mixed $result
     * @param string $redirectUrl
     * @return Json
     */
    function error(string $msg = '', $result = [], string $redirectUrl = '', $httpCode = 200): Json
    {
        $data = [
            'code' => 0,
            'msg' => $msg,
            'result' => $result,
            'url' => $redirectUrl
        ];
        return json($data,$httpCode, ['Access-Control-Expose-Headers'=>'Authorization']);
    }
}





//生成一个14位的随机数（一般是在第一次添加信息的时候因为没有id，用来关联附件的）
function make_pubid(): string
{
    return time() . rand(1000, 9999);
}

/**
 * 获取直接子元素
 * @param $arr
 * @param int $id
 * @param string $pid
 * @return array
 */
function getSons($arr, $id = 0, $pid = 'pid')
{
    $sons = [];
    foreach ($arr as $item) {
        if ($item[$pid] == $id)
            $sons[] = $item;
    }
    return $sons;
}

/**
 * 获取所有后代
 * @param $arr
 * @param int $id
 * @param string $pid
 * @param string $key
 * @return array
 */
function getSubs($arr, $id = 0, $pid = 'pid', $key = 'id')
{
    $subs = array();
    foreach ($arr as $item) {
        if ($item[$pid] == $id) {
            $subs[] = $item;
            $subs = array_merge($subs, getSubs($arr, $item[$key]));
        }
    }
    return $subs;
}


/**
 * 获取所有祖先
 * @param $arr
 * @param $id
 * @param string $pid
 * @return array
 */
function getParents($arr, $id, $pid = 'pid')
{
    $tree = array();
    $res = [];
    foreach ($arr as $v) {
        $res[$v['id']] = $v;
    }
    $parent_id = $res[$id][$pid];
    while ($parent_id != 0) {
        $tree[] = $res[$parent_id];
        $parent_id = $res[$parent_id][$pid];
    }
    return $tree;
}


/**
 * 调试
 * @param $data
 */
function test($data)
{
    $debugRes = debug_backtrace();
    $back = $debugRes[0];
    $line = FileWrapper::get_line($back['file'], $back['line'] - 1, $back['line'] - 1);
    preg_match('/test\((.*)\);/', $line, $arr);
    echo '<h4 style="color: #0d95e8">' . $arr[1] . '</h4>';
    dump($data);
}


/**
 * 把返回的数据集转换成Tree
 * @param array $rows 要转换的数据集
 * @param string $id 主键id
 * @param string $pid parent标记字段
 * @param string $child 子节点存放的位置
 * @return array
 */
function list2Tree(array $rows, string $id = 'id', string $pid = 'pid', string $child = 'child'): array
{
    $items = [];
    $res = [];

    foreach ($rows as $row) {
        $items[$row[$id]] = $row;
    }

    foreach ($items as $item) {
        if ($item[$pid]) {
            $items[$item[$pid]][$child][] = &$items[$item['id']];
        } else {
            $res[$item['id']] =  &$items[$item['id']];
        }
    }

    return $res;
}


//查询方法过滤
function search_in($str): string
{
    $farr = ["/^select[\s]+|insert[\s]+|and[\s]+|or[\s]+|create[\s]+|update[\s]+|delete[\s]+|alter[\s]+|count[\s]+|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i"];
    $str = preg_replace($farr, '', html_in($str));
    return trim($str);
}


//html代码输入
function html_in($str): string
{
    $str = htmlspecialchars($str);
    $str = strip_tags($str);
    return addslashes($str);
}


//html代码输出
function html_out($str): string
{
    $str = htmlspecialchars_decode($str);
    return stripslashes($str);
}

//解密函数
function decrypt($data, $key = 'ZZWBKJ_ZHIHUAWEI', $iv = 'ZZWBKJ_ZHIHUAWEI'): string
{
    return openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, 1, $iv);
}

// input 解密过滤
function secret_processing($data)
{
    if (substr($data, -5) === '==s==') {
        return decrypt(substr($data,0,-5));
    }
    return $data;
}

/**
 * input数据根据数据表分组
 * group_by_table_name
 * @param $data
 * @return array
 */
function group_by_table_name($data): array
{
    $res = [];
    foreach ($data as $key => $item) {
        [$table_name, $field_name] = explode('__', $key);
        $res[$table_name][$field_name] = $item;
    }
    return $res;
}
